package controller

import (
	"account/models"
	"account/service"
	"fmt"
	"net/http"
	"strconv"
	"time"

	"github.com/gin-gonic/gin"
)

// 定义AccountController结构体，返回accountService
type AccountController struct {
	accountService *service.AccountService
}

// 定义实例化AccountController的方法
func NewAccountController(accountService *service.AccountService) *AccountController {
	return &AccountController{accountService: accountService}
}

// 定义添加账单记录的方法
func (ac *AccountController) AddAccount(c *gin.Context) {
	var account struct {
		ID       int     `json:"id"`
		Amount   float64 `json:"amount"`   // 金额
		Date     string  `json:"date" `    // 日期格式：2006-01-02
		Category string  `json:"category"` // 收入或支出
		Reason   string  `json:"reason"`   //收入来源或支出原因
	}

	if err := c.ShouldBindJSON(&account); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	// 解析日期字段
	date, err := time.Parse("2006-01-02", account.Date)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid date format, expected YYYY-MM-DD"})
		return
	}
	// 创建用户对象
	Newaccount := models.Account{
		ID:       account.ID,
		Amount:   account.Amount,
		Date:     models.Date(date),
		Category: account.Category,
		Reason:   account.Reason}
	if err := ac.accountService.AddAccount(&Newaccount); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}
	c.JSON(http.StatusOK, gin.H{"message": "Account Add successfully"})
}

// 定义根据日期查看支出的方法
func (ac *AccountController) GetOutCome(c *gin.Context) {
	date := c.Query("date")
	fmt.Println("daaaaaaaaaaa:" + date)
	sum, err := ac.accountService.GetOutCome(date)
	if err != nil {
		c.JSON(http.StatusNotFound, gin.H{"error": "query has error"})
		return
	}
	c.JSON(http.StatusOK, sum)
}

// 定义根据日期查看收入的方法
func (ac *AccountController) GetInCome(c *gin.Context) {
	date := c.Query("date")
	sum, err := ac.accountService.GetInCome(date)
	if err != nil {
		c.JSON(http.StatusNotFound, gin.H{"error": err.Error()})
		return
	}
	c.JSON(http.StatusOK, sum)
}

// GetAccounts 获取分页账户数据
// func (c *AccountController) PaginateAccountsWithCondition(ctx *gin.Context) {
// 	// 从查询参数中获取分页信息和查询条件
// 	page, _ := strconv.Atoi(ctx.DefaultQuery("page", "1"))          // 默认第 1 页
// 	startDate := ctx.DefaultQuery("startDate", "2025")              // 默认开始日期
// 	endDate := ctx.DefaultQuery("endDate", "2025")                  // 默认开始日期
// 	category := ctx.DefaultQuery("category", "支出")                  // 默认类别为 "支出"

// 	// 调用 Service 层获取数据
// 	result, err := c.accountService.PaginateAccountsWithCondition(page, startDate, endDate, category)
// 	if err != nil {
// 		ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
// 		return
// 	}

// 	// 返回分页结果
// 	ctx.JSON(http.StatusOK, result)
// }

// 分页查询所有记录
// func (c *AccountController) GetAllAccountWithLimit(ctx *gin.Context) {
// 	// 从查询参数中获取分页信息和查询条件
// 	page, _ := strconv.Atoi(ctx.DefaultQuery("page", "1"))          // 默认第 1 页

// 	// 调用 Service 层获取数据
// 	result, err := c.accountService.GetAllAccountWithLimit(page)
// 	if err != nil {
// 		ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
// 		return
// 	}

// 	// 返回分页结果
// 	ctx.JSON(http.StatusOK, result)
// }
// 终极分页查询
func (c *AccountController) GetAccounts(ctx *gin.Context) {
// 从查询参数中获取分页信息和查询条件
page, _ := strconv.Atoi(ctx.Query("page"))          // 默认第 1 页
startDate := ctx.Query("startDate")              // 默认开始日期
endDate := ctx.Query("endDate")                  // 默认开始日期
category := ctx.Query("category")                  // 默认类别为 "支出"

// 调用 Service 层获取数据
result, err := c.accountService.GetAccounts(page, startDate, endDate, category)
if err != nil {
	ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
	return
}

// 返回分页结果
ctx.JSON(http.StatusOK, result)
}
   